package com.xiaolin.structure.queue.array;

/**
 * @ClassName DemoQueue
 * @Description 队列数据结构实现--根据数组实现
 * @Detail
 *              说明：
 *                  1、队列满的条件： this.size == this.capacity
 *                  2、队列空的条件： this.size == 0
 * @Author MyPC
 * @Date 2020/11/7
 * @Version 1.0
 */
public class DemoQueue<E> {
    //元素个数
    private int size=0;
    //容量
    private int capacity;
    //元素数组
    private Object[] elementArray;
    //指向队头元素的前一个位置
    private int front=-1;
    //指向队尾元素
    private int rear=-1;

    public DemoQueue(){
        this.capacity=1024;
        this.elementArray=new Object[this.capacity];
    }

    public DemoQueue(int capacity){
        this.capacity=capacity;
        this.elementArray=new Object[this.capacity];
    }

    /**
     * 添加元素
     * @param e
     * @return
     */
    public boolean add(E e){
        if(this.size == this.capacity){
            throw new RuntimeException("队列已满");
        }
        if(this.rear==this.capacity-1){
            //队尾元素指向数组尾部时还能添加元素，说明之前移除过元素，将队尾元素指向数组头部
            this.rear=-1;
            elementArray[++rear]=e;
        }else {
            elementArray[++rear]=e;
        }
        this.size++;
        return true;
    }

    /**
     * 移除元素
     * @return
     */
    public E remove(){
        if(this.size == 0){
            throw new RuntimeException("队列为空");
        }
        E temp=null;
        if(this.front == this.capacity-1){
            //队头元素指向数组尾部时还能移除元素，说明之前移除过元素，将队头元素指向数组头部
            this.front=-1;
            temp=(E)elementArray[front+1];
            elementArray[++front]=null;
        }else {
            temp=(E)elementArray[front+1];
            elementArray[++front]=null;
        }
        this.size--;
        return temp;
    }

    /**
     * 获取元素大小
     * @return
     */
    public int size(){
        return this.size;
    }

    /**
     * 获取第一个元素
     * @return
     */
    public E getFront(){
        if(this.size == 0){
            throw new RuntimeException("队列为空");
        }
        if(this.front==this.capacity-1){
            return (E)this.elementArray[0];
        }
        return (E)this.elementArray[this.front+1];
    }

    /**
     * 获取最后一个元素
     * @return
     */
    public E getRear(){
        if(this.size == 0){
            throw new RuntimeException("队列为空");
        }
        return (E)this.elementArray[this.rear];
    }

}
